# 第一遍
import pymysql
# 数据库操作模块
# 封装一个数据库操作类 DB
# 读方法 read（sql） return 受影响行数，结果集
# 写方法 write（sql） return 受影响行数

class DB:                  # 封装一个数据库操作类 DB
    def __init__(self, database, host='localhost', user='root', password='root', port=3306, charset='utf8',
                 cursor_type=pymysql.cursors.Cursor):      # 传入形参，形参可设置默认参数
    # 初始化连接对象
    # 1.将内部参数赋值变量 2.连接对象设置为私有属性
        self.__conn = pymysql.connect(database=database, host=host, user=user,
                                      password=password, port=port, charset=charset)

    # 初始化游标对象
    # 游标类型：元组 字典
    # 1.游标对象设置为私有属性 2.游标对象传入cursor_type，可以更改游标类型是元组或字典
        self.__cursor = self.__conn.cursor(cursor_type)
# 定义读功能
    def read(self,sql,params_list=[]):              # 传入params_list=[]为解决sql注入问题
        try:                                        # 捕获异常
            # 执行sql语句
            rows = self.__cursor.execute(sql,params_list)
            # 获取结果集
            data = self.__cursor.fetchall()
        except Exception as e:
            print('sql语句有问题')
            return None, 'No Data'                  # 加上'No Data' 为了保证返回参数完整
        return rows, data

# 定义写功能
    def write(self, sql):                           # 传入params_list=[]为解决sql注入问题（此处省略）
        try:
            # 执行sql语句
            rows = self.__cursor.execute(sql)
        except Exception as e:
            # 回滚
            self.__conn.rollback()
            return 0
            # 提交
        else:
            self.__conn.commit()
            return  rows

    def __del__(self):                                # 用__del__魔术方法可以在上面程序执行后自动关闭需要关闭的对象
        # 对象销毁后执行的方法
        self.__cursor.close()
        self.__conn.close()


if __name__ == '__main__':
    db = DB('advanced')
    # rows, data = db,read('select * from student)
    # print(data)
    name = input('name:')
    rows, data = db.read(f'select * from student where stu_name=%s', [name])
    print(data)

    '''
    db = DB('advanced', cursor_type=pymysql.cursors.DictCursor)
    # 读操作
    rows, data = db.read('select * from student')
    if rows:
        print(rows, data)

    # 写操作
    rows = db.write("INSERT INTO student(stu_no, stu_name) VALUES('itsrc-017', '周杰伦1')")

    if rows:
        print('写入成功')
    '''

























